<?php
/**
 * Inter框架辅助组件 - 文件操作
 * 本文件是Inter框架的文件操作方法集合
 * 本组件依赖性：
 * - 暂无
 * 本文件的思路参考过以下程序，在此一并致谢！
 * - xweibo{@link http://x.weibo.com}
 * - thinkphp{@link http://www.thinkphp.cn}
 * 
 * @author Horse Luke<horseluke@126.com>
 * @copyright Horse Luke, 2010
 * @license the Apache License, Version 2.0 (the "License"). {@link http://www.apache.org/licenses/LICENSE-2.0}
 * @version $Id: File.php 144 2011-01-23 12:59:23Z horseluke@126.com $
 * @package Inter_PHP_Framework
 */

class Inter_Util_File{
    
    /**
     * 判断给定的文件名是否可写（修正在win主机下用php函数is_writable判断失误的问题）
     * 如果文件存在并且可写则返回true，否则返回false
     * 本函数可单独抽取使用
     * 
     * @param $filename 文件名
     * @return boolen 返回结果
     */
    public static function is_writable($filename) {
        if( !file_exists( $filename ) ){
            return false;
        }
        
        $fp = @fopen ( $filename, 'ab+' );
        if ( false == $fp ) {
            @fclose ( $fp );
            return true;
        } else {
            return false;
        }    
    }
    
    /**
     * 判断目录是否可写（也可一并检查是否可删）
     * 本函数可单独抽取使用
     * @param string $dirpath 目录路径，结尾不要加斜杠
     * @param boolen $checkDEL 是否检查目录是否可删。默认为否
     */
    public static function dir_is_writable($dirpath, $checkDEL = FALSE ) {
        $dirpath = realpath($dirpath);
        if( !is_dir( $dirpath ) ){
            return false;
        }
        
        $filename = $dirpath. DIRECTORY_SEPARATOR. 'TEST_WRITEABLE_'. time();
        $result = @file_put_contents( $filename, 'TEST_WRITEABLE', LOCK_EX );
        if( 0 === $result ){
            return false;
        }else{
            $result = @unlink( $filename );
            if( true === $checkDEL && false === $result ){
                return false;
            }else{
                return true;
            }
        }
        
    }
    
    /**
     * 在win平台下，判断给出的文件名称是否大小写敏感
     * @param string $filepath 文件名所在的全路径
     */
    public static function file_exists_case($filepath) {
        if (is_file ( $filepath )) {
            if ( strstr(PHP_OS, 'WIN') ) {
                if (basename ( realpath ( $filepath ) ) != basename ( $filepath ))
                    return false;
            }
            return true;
        }
        return false;
    }
    
}